package regexp;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 分组、捕获、反向引用
 */
public class RegExp10 {

    public static void main(String[] args) {

        /*
            给一段文本，找出所有四个数字连在一起的字串，并且这四个数字要满足
            1.第1位与第4位相同
            2.第2位与第3位相同
            如：1221 5775


            1)分组；可以用圆括号组成一个比较复杂的匹配模式，那么一个圆括号的部分可以看作一个子表达式/一个分组
            2)捕获：把正则表达式中子表达式/分组匹配的内容，保存到内存中以数字编号或显式命名的组里，方便后面引用，
                   从左向右，以分组的左括号为标志，第一个出现的分组组号为1，第二个为2，以此类推。组0代表的式整个正则式
            3)反向引用：圆括号的内容被捕获后，可以在这个括号后被使用，从而写出一个比较实用的匹配模式，这个称为反向引用，
                   这种引用既可以是在正则表达式内部，也可以是在正则表达式外部，内部反向引用 \\分组号，外部反向引用 $分组号

            把 类似 :"我....我要....学学学学....编程java!";
            通过正则表达式 修改成 "我要学编程java"
         */
        String content = "我....我要....学学学学....编程 java!";

        //1. 去掉所有的.
        Pattern pattern = Pattern.compile("\\.");
        Matcher matcher = pattern.matcher(content);
        content = matcher.replaceAll("");

        // 思路
        //2. 去掉重复的字 我我要学学学学编程java!
        //(1) 使用 (.)\\1+
        //(2) 使用 反向引用$1 来替换匹配到的内容
        // 注意：因为正则表达式变化，所以需要重置 matcher
//        pattern = Pattern.compile("(.)\\1+");//分组的捕获内容记录到$1
//        matcher = pattern.matcher(content);
//        while (matcher.find()) {
//            System.out.println("找到="+matcher.group(0));
//        }
        //使用反向引用$1来替换匹配到的内容
        // content=matcher.replaceAll("$1");
        // System.out.println("content="+content);

        //3.使用一条语句去掉重复的字我我要学学学学编程java!
        content = Pattern.compile("(.)\\1+").matcher(content).replaceAll("$1");
        System.out.println("content="+content);
    }
}
